package de.hhn.mim.psb;

import static org.junit.Assert.*;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

/**
 * 
 */

/**
 * Klasse zum Testen der Matrix3D Klasse
 * 
 * TODO:
 * Tests sind unvollstaendig, es muessen noch Erfolgs- oder Fehlerkriterien
 * definiert und implementiert werden
 * @author Rolf Bendl
 * 
 * 2012-05-12: Test erstellt
 *
 */
public class Matrix3DTest
 {

  /**
   * @throws java.lang.Exception
   */
  @BeforeClass
  public static void setUpBeforeClass() throws Exception
   {
   }

  /**
   * @throws java.lang.Exception
   */
  @AfterClass
  public static void tearDownAfterClass() throws Exception
   {
   }

  /**
   * @throws java.lang.Exception
   */
  @Before
  public void setUp() throws Exception
   {
   }

  /**
   * @throws java.lang.Exception
   */
  @After
  public void tearDown() throws Exception
   {
   }

  /**
   * Methode f�r {@link Matrix3D#mult(Vect3D)} testen
   */
  @Test
  public final void testMultVect3D()
   {
    trafoTest1();
    trafoTest2();
    System.out.println("Bitte Ausgabe manuell kontrollieren!");
    
    //TODO Testbedingungen formulieren!
   }
  /**
   * trafoTest1 testet Reihenfolge der Matrixmultiplikation
   * erzeugt Vektor (100, 0, 0) und rotiert ihn zuerst um Z-Achse
   * erwartetes Ergebnis: (0, 100, 0) und rotiert das Zwischenergebnis um X-Achse
   * erwartetes Ergebnis: (0, 0, 100)
   * Erzeugt kombinierte Transformation mZmX (* v), => Rotation um x dann um z
   * erwartetes Ergebnis: erste Rotation hat keinen Effekt (Punkt auf der x-Achse)
   *                      zweite Rotation um z-Achse(0, 100, 0)
   * Erzeugt kombinierte Transformation mXmZ (* v), => Rotation um z dann um x
   * erwartetes Ergebnis: (0, 0, 100)
   * Erzeugt eine kombinierte Transformation MzMyMx (* v), erwartetes Ergebnis
   * {0, 100, 0}
   *                      
   */
    public void trafoTest1()
     {
      Vect3D v    = new Vect3D(100, 0, 0);
      Vect3D v2   = new Vect3D(0, 100, 0);
      Matrix3D mZ = Matrix3D.rotationZ(Math.PI/2.0);
      Matrix3D mX = Matrix3D.rotationX(Math.PI/2.0);
      Matrix3D mY = Matrix3D.rotationY(Math.PI/2.0);
      Vect3D vZ90 = mZ.mult(v);
      Vect3D.print("rZ90      ", v, v, vZ90);
      Vect3D vZ90X90 = mX.mult(vZ90);
      Vect3D.print("rZ90rX90  ", v, v, vZ90X90);
      
      Matrix3D trafo = new Matrix3D(1);
      trafo = trafo.mult(mZ);
//      trafo.print("trafo_mZ");
      Vect3D vTrafo_mZ = trafo.mult(v);
      Vect3D.print("trafo_mZ  ", v, v, vTrafo_mZ);
      
      trafo = mX.mult(mZ);
//      trafo.print("trafo_mZmX");
      Vect3D vTrafo_mZmX = trafo.mult(v);
      Vect3D.print("trafo_mZmX", v, v, vTrafo_mZmX);
      
      Matrix3D trafo2 = new Matrix3D(1);
      trafo2 = trafo2.mult(mX);
//      trafo2.print("trafo2_mX");
      Vect3D vTrafo2_mX = trafo2.mult(v);
      Vect3D.print("trafo2_mX  ", v, v, vTrafo2_mX);
      
      trafo2 = mZ.mult(mX);
//      trafo2.print("trafo_mXmZ");
      Vect3D vTrafo2_mXmZ = trafo2.mult(v);
      Vect3D.print("trafo2_mXmZ", v, v, vTrafo2_mXmZ);
      
      trafo2 = mX.mult(mY);
      Vect3D vTrafo2_mYmX = trafo2.mult(v2);
      Vect3D.print("trafo2_mYmX", v2, v2, vTrafo2_mYmX);
      
      trafo2 = trafo2.mult(mZ);
      Vect3D vTrafo2_mZmYmX = trafo2.mult(v2);
      Vect3D.print("trafo2_mZmYmX", v2, v2, vTrafo2_mZmYmX);    
     }
    
    /**
     * Rotiert den Punkt (0,100,0) um jeweils 45� um die x, y, und z-Achse 
     * und gibt das Ergebnis in der Konsole aus
     */
    public void trafoTest2()
     {
      Vect3D v    = new Vect3D(100, 0, 0);
      Vect3D v2   = new Vect3D(0, 100, 0);
      Matrix3D mZ = Matrix3D.rotationZ(-Math.PI/4.0);
      Matrix3D mX = Matrix3D.rotationX(Math.PI/4.0);
      Matrix3D mY = Matrix3D.rotationY(Math.PI/4.0);

      Matrix3D trafo = new Matrix3D(1);        
      trafo = trafo.mult(mX);
      Vect3D vTrafo_mX = trafo.mult(v2);
      Vect3D.print("trafo2_mX", v2, v2, vTrafo_mX);
      
      Matrix3D trafo2 = new Matrix3D(1);        
      trafo2 = mX.mult(mY);
      Vect3D vTrafo2_mYmX = trafo2.mult(v2);
      Vect3D.print("trafo2_mYmX", v2, v2, vTrafo2_mYmX);
      
      trafo2 = trafo2.mult(mZ);
      Vect3D vTrafo2_mZmYmX = trafo2.mult(v2);
      Vect3D.print("trafo2_mZmYmX", v2, v2, vTrafo2_mZmYmX);    
     }

 }
